#ifndef __BOOT_UPDATE_H
#define __BOOT_UPDATE_H

#include "gd32f4xx.h"
#include "device_info.h"
#include <string.h>

// 布尔类型定义
#ifndef bool
typedef uint32_t bool;
#define true 1
#define false 0
#endif

// 协议常量定义
#define FRAME_SOF 0xAA     // 帧头
#define FRAME_MAX_SIZE 256 // 最大帧长度

// 命令定义
#define CMD_UPDATE_REQ 0x01    // 升级请求
#define CMD_UPDATE_ACK 0x02    // 升级确认
#define CMD_UPDATE_DATA 0x03   // 升级数据
#define CMD_UPDATE_END 0x04    // 升级结束
#define CMD_UPDATE_VERIFY 0x05 // 升级验证
#define CMD_UPDATE_RESET 0x06  // 系统复位
#define CMD_UPDATE_NACK 0x07   // 错误响应
#define MIN_FRAME_SIZE 6       // 最小帧长度
// 升级状态定义
typedef enum
{
    CMD_UPDATE = 0x3c,
} cmd_t;
// 帧结构体
typedef struct
{
    uint8_t sof;                  // 帧头
    uint8_t cmd;                  // 命令字
    uint8_t length;               // 数据长度
    uint8_t data[FRAME_MAX_SIZE]; // 数据缓冲区
    uint8_t crc;                  // CRC8校验
} frame_t;
// 串口缓冲区结构体
typedef struct
{
    uint8_t buf[FRAME_MAX_SIZE];
    uint8_t wr_index;
    uint8_t rd_index;
} uart_buffer_t;

// 函数声明
void update_init(void);
void update_process(void);
uint8_t send_frame(frame_t *frame);
uint16_t calculate_crc16(uint8_t *data, uint16_t length);
bool write_flash_data(uint8_t *data, uint16_t length);
bool verify_firmware(void);
void execute_user_code(void);
uint8_t check_app_valid(void);
#endif